package cn.tedu.charging.order.Job;


import cn.tedu.charging.common.pojo.param.GunStatusUpdateParam;
import cn.tedu.charging.order.utils.SpringContextJobUtil;
import cn.tedu.charging.order.constant.Constant;
import cn.tedu.charging.order.dao.repository.OrderRepository;
import cn.tedu.charging.order.pojo.po.ChargingBillFailPO;
import cn.tedu.charging.order.pojo.po.ChargingBillSuccessPO;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.util.Date;
import java.util.UUID;

@Slf4j
public class DeviceCheckJob implements Job {

//    //数据操作层
//    private static OrderRepository orderRepository;
//    //设备服务操作客户端
//    private static DeviceClient deviceClient;



    public DeviceCheckJob(){}

    public DeviceCheckJob(String orderNo,Integer gunId) throws Exception{
        log.debug("添加设备自检定时任务",orderNo);
        //创建调度器工厂
        SchedulerFactory schedulerFactory = new StdSchedulerFactory();
        //通过调度器工厂获取调度器
        Scheduler scheduler = schedulerFactory.getScheduler();
        //创建定时任务
        JobDetail jobDetail = JobBuilder.newJob(DeviceCheckJob.class)
                .withIdentity("DeviceCheckJob" + UUID.randomUUID(), "device_check_job")
                //传入订单号
                .usingJobData("orderNo", orderNo)
                .usingJobData("gunId",gunId)
                //构建
                .build();
        //当前时间
        long now = System.currentTimeMillis();
        //设置自检时间为两分钟
        long deviceCheckTime = 60*1000;
        //任务触发的时间
        Date triggerTime = new Date(now + deviceCheckTime);
        //创建触发器并设置时间
        Trigger trigger = TriggerBuilder.newTrigger().startAt(triggerTime).build();
        //定时任务和触发器绑定到调度
        scheduler.scheduleJob(jobDetail,trigger);
        //自动调度器
        scheduler.start();
    }

    //定时器的具体业务
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        log.debug("任务开始执行:context= {}",context);
        //任务开始执行后,业务应该如何处理
        //1 设备接收到了充电指令,返回了开始充电成功指令 成功订单表有数据
        //2 设备接收到了充电指令,返回了开始充电失败指令 失败订单表有数据
        //3 没有收到任何设备返回的信息, 成功订单表没数据  失败订单表没数据  设备无响应
        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
        log.debug("jobDataMap={}",jobDataMap);
        String orderNo = jobDataMap.getString("orderNo");
        int gunId = jobDataMap.getInt("gunId");

        OrderRepository orderRepository = (OrderRepository)SpringContextJobUtil.getBean("orderRepository");
        //判断订单成功表中有没有数据
        ChargingBillSuccessPO dbsuccessPO = orderRepository.getSuccess(orderNo);
        if (dbsuccessPO == null){ //设备没有创建成功的订单数据
            //没有成功订单数据
            //判断订单失败表中有没有数据
            ChargingBillFailPO dbBillFailPO = orderRepository.getFail(orderNo);
            if (dbBillFailPO == null) { // 设备没有创建成功订单数据和失败订单数据
                //订单成功表中没有数据
                //订单失败的在MQTT中就可以进行数据的插入操作
                ChargingBillFailPO chargingBillFailPO = new ChargingBillFailPO();
                chargingBillFailPO.setBillId(orderNo);
                chargingBillFailPO.setFailDesc("设备无响应");
                orderRepository.saveFailOrder(chargingBillFailPO);
            }
            //有成功的订单数据但是有失败的
            //成功没有数据,设备故障了,更改设备状态(状态异常 ERROR)
            GunStatusUpdateParam updateParam = new GunStatusUpdateParam();
            updateParam.setStatus(Constant.GUN_STATS_ERROR);
            updateParam.setId(gunId);
            //deviceClient.updateGunStatusParam(updateParam);
        }else{
            //有成功的数据,完善订单数据的操作
            orderRepository.updateSuccessOrder(orderNo,gunId);
        }


    }
}
